BA
pedido

[Pedido] Spells Especiais 8.6

Por baratask, 30 de jan. de 2016 em Scripts

spells
8.60
34
5.9k
barataskB
04 de fevereiro de 2016 às 23:17

Bom, estou muito agradecido por vocês estarem se empenhando para me ajudar, eu estou desenvolvendo 1 projeto que na verdade é um sonho que estou realizando eu sou um pouco leigo em relação a criação de scripts e programação, sou um mero mapper, mas sempre que posso mecho com script.

 

obrigado, aguardo resultado de vcs para me ajudar com esses 3 pedidos, de coração mesmo!

 

Segue link do projeto: http://www.xtibia.com/forum/topic/239277-worldofempera-rpg/

zipter98Z
04 de fevereiro de 2016 às 23:41

Skulls, as alterações nas sources que mencionei se aplicam somente ao caso do sistema da PxG. Essa estátua pode ser escrita puramente em Lua. Entretanto, ainda é preciso de mais algumas informações quanto ao sistema de ataque dela (se será de x em x tempo, constante; chance de ativação, em tempo constante ou variável/aleatório; etc). Se o autor puder informar-nos quanto a isso, suponho que não haverão mais dúvidas para começar a escrita dos pedidos.

barataskB
05 de fevereiro de 2016 às 00:35

Bom, em relação a chance de ataque, tempo .. fica a criterio de vocês tudo isso, pode cria a spell qualquer coisa eu modifico isso, pode ser de 2 em 2 segundos os ataques da estatua "ataque em death" lembrando que ela apos conjurada ataque todos que estive a 5 sqm dela em target aleatoriamente "so não ataque quem a sumonou"

SkullsS
05 de fevereiro de 2016 às 06:58

Skulls, as alterações nas sources que mencionei se aplicam somente ao caso do sistema da PxG. Essa estátua pode ser escrita puramente em Lua. Entretanto, ainda é preciso de mais algumas informações quanto ao sistema de ataque dela (se será de x em x tempo, constante; chance de ativação, em tempo constante ou variável/aleatório; etc). Se o autor puder informar-nos quanto a isso, suponho que não haverão mais dúvidas para começar a escrita dos pedidos.

Sim, claro são dois contextos separados. Eu queria saber pq fiz em lua uma forma de monstros lutarem entre si e fiquei pensando se com npcs seria mais fácil. Mas essa questão de vida e de morrer complica.
barataskB
06 de fevereiro de 2016 às 08:29

Alguém vai poder me ajudar referente a isso?

Night WolfN
10 de fevereiro de 2016 às 08:32

eu te ajudo no primeiro e no terceiro porque to curioso em como o Zipter vai fazer o segundo..

Só aguenta eu ter um tempo maior livre pra sentar e testar isso pra não te entregar um código feito às pressas e que pode ter bugs.

SkullsS
10 de fevereiro de 2016 às 13:16

eu te ajudo no primeiro e no terceiro porque to curioso em como o Zipter vai fazer o segundo..

 

Só aguenta eu ter um tempo maior livre pra sentar e testar isso pra não te entregar um código feito às pressas e que pode ter bugs.

Acabei fazendo a 2 aqui de bobeira xD

 

@@baratask

 

Tente isso:

 <instant name="Statue Attack" words="utevo res statue" lvl="1" mana="500" prem="0" exhaustion="20000" groups="1,4000" icon="23" needlearn="0" event="script" value="attack/statue.lua">
        <vocation id="1"/>
        <vocation id="2"/>
        <vocation id="3"/>
        <vocation id="4"/>
        <vocation id="5"/>
        <vocation id="6"/>
        <vocation id="7"/>
        <vocation id="8"/>
    </instant>

Em um arquivo chamado statue.lua, dentro de spells/attack coloque o codigo:

local config = {
    statue = 1444,
    range = 5,
    max_dmg = -150,
    min_dmg = -50,
    hit_delay = 1000,
    statue_time = 10*1000,
    cd = 20,
    stg = 5570
}

local max_hits = config.statue_time/config.hit_delay

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
setCombatFormula(combat, COMBAT_FORMULA_DAMAGE, 0, config.min_dmg, 0, config.max_dmg)

local condition = createConditionObject(CONDITION_INFIGHT)
setConditionParam(condition, CONDITION_PARAM_TICKS, 10 * 1000)

function removeItem(pos)
    doRemoveItem(getTileItemById(pos, config.statue).uid)
end

function attackSpecs(cid, pos, var, hits)
n = hits or 0

    if n >= max_hits then return false end

    local spec = getSpectators(pos, config.range, config.range)
    i = spec[math.random(1, #spec)]
    
if #spec <= 1 then return false end
    while(i == cid) do
        i = spec[math.random(1, #spec)] 
    end
        if isCreature(i) then
            var.pos = getCreaturePosition(i)
            doSendDistanceShoot(pos, var.pos, CONST_ANI_SUDDENDEATH)
            doCombat(cid, combat, var)
        end

    addEvent(attackSpecs, config.hit_delay, cid, pos, var, n+1)
end

function itemInteraction(cid, pos, var)
    attackSpecs(cid, pos, var)
    addEvent(removeItem, config.statue_time, pos)
end

function onCastSpell(cid, var)
    if not isPlayer(cid) then return false end

    if getPlayerStorageValue(cid, config.stg) - os.time() <= 0 then
        doAddCondition(cid, condition)
        setPlayerStorageValue(cid, config.stg, os.time() + config.cd)
        local pos = Position(getCreaturePosition(cid).x+1, getCreaturePosition(cid).y, getCreaturePosition(cid).z)
        doCreateItem(config.statue, 1, pos)
        itemInteraction(cid, pos, var)
    else
        doPlayerSendCancel(cid, "You're exhausted.")
    end
    return true
end

 

Me dê retorno.

 

gif dela:

giphy.gif

Abraços,

 

ps: você não deu maiores detalhes como no que depende o dano, velocidade dos hits, nem cooldown, qual estatua usar, etc. Então fiz do jeito que preferi, mas é altamente customizável basta mexer/pedir.

Editado Fevereiro 11 por Skulls

barataskB
10 de fevereiro de 2016 às 21:12

Retornei , irei testar e retorno pra avisar!

SkullsS
10 de fevereiro de 2016 às 21:56

Terceira:

    <instant name="Skell Summon" words="utevo res skell" lvl="1" mana="500" prem="0" exhaustion="1" groups="1,1" icon="23" needlearn="0" event="script" value="attack/skellsummon.lua">
        <vocation id="1"/>
        <vocation id="2"/>
        <vocation id="3"/>
        <vocation id="4"/>
        <vocation id="5"/>
        <vocation id="6"/>
        <vocation id="7"/>
        <vocation id="8"/>
    </instant>
local config = {
    creature = "Demon",
    summon_time = 15*1000,
    cd = 20,
    stgs = {cd = 5571, remove = 5572},
    life_percent = 20
}

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false)

local condition = createConditionObject(CONDITION_INFIGHT)
setConditionParam(condition, CONDITION_PARAM_TICKS, 15 * 1000)

function removeSummon(cid)
    if getPlayerStorageValue(cid, config.stgs.remove) == -1 then return false end

    if not isPlayer(cid) then return false end

    summons = getCreatureSummons(cid)
    for _, i in pairs(summons) do
        if isCreature(i) then
            if getCreatureName(i) == config.creature then
                doRemoveCreature(i)
                setPlayerStorageValue(cid, config.stgs.remove, -1)
                doRemoveCondition(cid, CONDITION_INFIGHT)
                return true
            end
        end
    end
    return false
end

function onCastSpell(cid, var)
    if not isPlayer(cid) then return false end

    if getPlayerStorageValue(cid, config.stgs.remove) ~= -1 then
        summons = getCreatureSummons(cid)
        for _, i in pairs(summons) do
            if isCreature(i) then
                if getCreatureName(i) == config.creature then
                    doRemoveCreature(i)
                    setPlayerStorageValue(cid, config.stgs.remove, -1)
                    doCreatureAddHealth(cid, getCreatureMaxHealth(cid)*config.life_percent/100)
                    doCombat(cid, combat, var)
                    doRemoveCondition(cid, CONDITION_INFIGHT)
                    return true
                end
            end
        end
        return false
    end

    if getPlayerStorageValue(cid, config.stgs.cd) - os.time() <= 0 then
        doAddCondition(cid, condition)
        setPlayerStorageValue(cid, config.stgs.cd, os.time() + config.cd)
        setPlayerStorageValue(cid, config.stgs.remove, 1)
        doCombat(cid, combat, var)
        monster = doSummonCreature(config.creature, getCreaturePosition(cid))
        doConvinceCreature(cid, monster)
        addEvent(removeSummon, config.summon_time, cid)
    else
        doPlayerSendCancel(cid, "You're exhausted.")
    end

    return true
end

Testa ai e ve se ta no jeito.

PS: mude o nome de Demon para o monstro que você quiser.

Abraços,

 

EDITADO:
SOBRE A PRIMEIRA SPELL ELA EH AREA 3x3 EM VOLTA DO PLAYER OU DIRECIONADA?

Editado Fevereiro 10 por Skulls

Night WolfN
10 de fevereiro de 2016 às 23:08

faz atacar só um target dos specs, todos fica zoado. Aí fica semelhante à torre do league

SkullsS
10 de fevereiro de 2016 às 23:17

faz atacar só um target dos specs, todos fica zoado. Aí fica semelhante à torre do league

Tambem acho, mas pelo pedido dele acho que são todos mesmo, não?

Night WolfN
10 de fevereiro de 2016 às 23:19

 

 

lembrando que ela apos conjurada ataque todos que estive a 5 sqm dela em target aleatoriamente

não sei dizer... eu entendi q queria que atacasse todos mas um por vez, de forma aleatoria.
SkullsS
12 de fevereiro de 2016 às 09:01

não sei dizer... eu entendi q queria que atacasse todos mas um por vez, de forma aleatoria.

Hm, pode ser. Mudarei isso então, fica até mais simples, pq ao inves de for terá um random. xD

Editei la da forma que você sugeriu.

 

Fiz a spell1 do jeito que eu entendi, não sei se está do jeito que você queria mas com alguns ajustes chegamos lá:

    <instant name="Spell1" words="baratask spell1" lvl="1" mana="100" prem="0" exhaustion="20000" groups="1,2000" icon="23" needlearn="0" event="script" value="attack/spell1.lua">
        <vocation id="1"/>
        <vocation id="2"/>
        <vocation id="3"/>
        <vocation id="4"/>
        <vocation id="5"/>
        <vocation id="6"/>
        <vocation id="7"/>
        <vocation id="8"/>
    </instant>
local config = {
    cd = 20,
    hit_delay = 2000,
    stg = 5573,
    life_percent = 5,
    mana_percent = 10,
    hits = 3
}

local combat = createCombatObject()

local area = createCombatArea(AREA_SQUARE3X3)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_LOSEENERGY)
setCombatArea(combat, area)

function onTargetCreature(cid, target)
    if not isCreature(target) then return false end
    local healthDmg = -getCreatureHealth(target)*config.life_percent/100
    local manaDmg = -getCreatureMana(target)*config.mana_percent/100
    doSendMagicEffect(getCreaturePosition(target), CONST_ME_MAGIC_RED)
    doTargetCombatHealth(cid, target, COMBAT_LIFEDRAIN, healthDmg, healthDmg, CONST_ME_MAGIC_RED)
    doTargetCombatMana(cid, target, manaDmg, manaDmg, CONST_ME_MAGIC_BLUE)
    return true
end

setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")

function attack(cid, var, hits)
n = hits or 0

    if n >= config.hits then return false end

    doCombat(cid, combat, var)
    addEvent(attack, config.hit_delay, cid, var, n+1)
end

function onCastSpell(cid, var)
    if not isPlayer(cid) then return false end

    if getPlayerStorageValue(cid, config.stg) - os.time() <= 0 then
        setPlayerStorageValue(cid, config.stg, os.time() + config.cd)
        attack(cid, var)
    else
        doPlayerSendCancel(cid, "You're exhausted.")
    end

    return true
end

Up, e ao cara funcionou?!

Editado Fevereiro 11 por Skulls

barataskB
12 de fevereiro de 2016 às 16:38

Sim, de forma aleatoria rs, mas vlw mesmo pela força de vcs to muito grato pela atenção.

SkullsS
12 de fevereiro de 2016 às 17:32

Sim, de forma aleatoria rs, mas vlw mesmo pela força de vcs to muito grato pela atenção.

Por nada cara. Mais alguma coisa ou tudo resolvido?

Caso esteja, marque como resolvido para moverem o tópico. Abraços!

Editado Fevereiro 12 por Skulls